package main

import (
	"fmt"
	"errors"
)

func main() {
	fmt.Printf("Hello, world or 你好，世界 or καλημ ́ρα κóσμ or こんにちはせかい\n\n")

	Run1()
	Run2()
	Run3()
	Run4()
	Run5()
	Run6()

	//test1()
}

/* 25个关键字

	break    default      func    interface    select
	case     defer        go      map          struct
	chan     else         goto    package      switch
	const    fallthrough  if      range        type
	continue for          import  return       var

* var和const 用于变量和常量申明
* package和import已经有过短暂的接触
* func 用于定义函数和方法
* return 用于从函数返回
* defer 用于类似析构函数
* go 用于并发
* select 用于选择不同类型的通讯
* interface 用于定义接口，参考2.6小节
* struct 用于定义抽象数据类型，参考2.5小节
* break、case、continue、for、fallthrough、else、if、switch、goto、default 用于流程控制
* chan用于channel通讯
* type用于声明自定义类型
* map用于声明map类型数据
* range用于读取slice、map、channel数据
*/

func test1() {
	// 定义变量 var xx (type) = 0
	var int1, int2 int = 1, 2;
	fmt.Println(int1, int2);
	// 定义变量(仅函数内部) xx := 0
	f1, f2 := 1.1, 2.2;
	f1 = f2; 
	f2 = f1;
	// 定义常量 const xx (type) = 0
	const PI = 3.1415926;

	// 字符串
	stmp := "abcde";
	// 字符串不可修改，需要借用byte数组
	ctmp := []byte(stmp);
	ctmp[2] = 'C';
	stmp = string(ctmp);
	// 字符串可以"+"和切片
	stmp = stmp + " " + stmp[2:3] + " " + stmp[2:] + " " + stmp[:3];

	// 错误类型 import "errors"
	err := errors.New("this is a error")
	if err != nil {
		fmt.Println(err)
	}

	// array数组
	var arr1 [10]int
	arr2 := [...]int{1, 2, 3}
	arr1[0] = arr2[0]
	// slice切片 和数组的区别就是 [] 不填长度
	var slc1 []int
	slc2 := []int{1, 2, 3}
	slc1[0] = slc2[0] //slice1仅声明未定义，这里会报错
	// map字典
	var map1 map[string]int = make(map[string]int)
	map2 := map[string]int{"one":1, "two":2}
	fmt.Println(map1, map2);

	// make用于3种内建类型（map、slice 和channel）的内存分配，返回初始化后的（非零）值
	// new用于各种类型的内存分配，返回指针

	/*  部分类型的零值
		int     0
		int8    0
		int32   0
		int64   0
		uint    0x0
		rune    0 		//rune的实际类型是 int32
		byte    0x0 	// byte的实际类型是 uint8
		float32 0 		//长度为 4 byte
		float64 0 		//长度为 8 byte
		bool    false
		string  ""
	*/
}
